package handler

import (
	"net/http"
	"strconv"

	"github.com/gin-gonic/gin"
	"github.com/yourusername/rss-reader-ai/internal/service"
)

// =====================================================
// FeedHandler 订阅源处理器
// =====================================================

// FeedHandler 订阅源HTTP处理器
type FeedHandler struct {
	feedService service.FeedService
}

// NewFeedHandler 创建订阅源处理器
func NewFeedHandler(feedService service.FeedService) *FeedHandler {
	return &FeedHandler{
		feedService: feedService,
	}
}

// RegisterRoutes 注册路由
func (h *FeedHandler) RegisterRoutes(router *gin.RouterGroup) {
	feeds := router.Group("/feeds")
	{
		feeds.POST("", h.AddFeed)           // 添加订阅源
		feeds.GET("", h.ListFeeds)          // 获取订阅源列表
		feeds.GET("/:id", h.GetFeed)        // 获取订阅源详情
		feeds.PUT("/:id", h.UpdateFeed)     // 更新订阅源
		feeds.DELETE("/:id", h.DeleteFeed)  // 删除订阅源
		feeds.POST("/:id/toggle", h.ToggleFeedStatus)  // 切换启用状态
		feeds.POST("/:id/refresh", h.RefreshFeed)      // 手动刷新单个
		feeds.POST("/refresh-all", h.RefreshAllFeeds)  // 手动刷新全部 ⭐ 新增
		feeds.GET("/stats", h.GetFeedStats)            // 统计信息
	}
}

// =====================================================
// API 请求/响应结构
// =====================================================

// AddFeedRequest 添加订阅源请求
type AddFeedRequest struct {
	URL      string `json:"url" binding:"required"`
	Title    string `json:"title"`
	Category string `json:"category"`
}

// UpdateFeedRequest 更新订阅源请求
type UpdateFeedRequest struct {
	Title    string `json:"title"`
	Category string `json:"category"`
	Interval int    `json:"interval"` // 抓取间隔(秒)
}

// =====================================================
// API 处理器
// =====================================================

// AddFeed 添加订阅源
// @Summary 添加订阅源
// @Tags Feed
// @Accept json
// @Produce json
// @Param feed body AddFeedRequest true "订阅源信息"
// @Success 200 {object} Response{data=model.Feed}
// @Router /api/feeds [post]
func (h *FeedHandler) AddFeed(c *gin.Context) {
	// 1. 解析请求参数
	var req AddFeedRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		ErrorResponse(c, http.StatusBadRequest, "参数错误: "+err.Error())
		return
	}

	// 2. 调用 Service
	feed, err := h.feedService.AddFeed(req.URL, req.Title, req.Category)
	if err != nil {
		ErrorResponse(c, http.StatusInternalServerError, err.Error())
		return
	}

	// 3. 返回成功响应
	SuccessResponse(c, feed)
}

// GetFeed 获取订阅源详情
// @Summary 获取订阅源详情
// @Tags Feed
// @Produce json
// @Param id path int true "订阅源ID"
// @Success 200 {object} Response{data=model.Feed}
// @Router /api/feeds/{id} [get]
func (h *FeedHandler) GetFeed(c *gin.Context) {
	// 1. 解析路径参数
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		ErrorResponse(c, http.StatusBadRequest, "无效的ID")
		return
	}

	// 2. 调用 Service
	feed, err := h.feedService.GetFeed(id)
	if err != nil {
		ErrorResponse(c, http.StatusNotFound, err.Error())
		return
	}

	// 3. 返回响应
	SuccessResponse(c, feed)
}

// ListFeeds 获取订阅源列表
// @Summary 获取订阅源列表
// @Tags Feed
// @Produce json
// @Param category query string false "分类筛选"
// @Success 200 {object} Response{data=[]model.Feed}
// @Router /api/feeds [get]
func (h *FeedHandler) ListFeeds(c *gin.Context) {
	// 1. 解析查询参数
	category := c.Query("category")

	// 2. 调用 Service
	var err error
	var feeds interface{}

	if category != "" {
		feeds, err = h.feedService.ListFeedsByCategory(category)
	} else {
		feeds, err = h.feedService.ListFeeds()
	}

	if err != nil {
		ErrorResponse(c, http.StatusInternalServerError, err.Error())
		return
	}

	// 3. 返回响应
	SuccessResponse(c, feeds)
}

// UpdateFeed 更新订阅源
// @Summary 更新订阅源
// @Tags Feed
// @Accept json
// @Produce json
// @Param id path int true "订阅源ID"
// @Param feed body UpdateFeedRequest true "更新信息"
// @Success 200 {object} Response
// @Router /api/feeds/{id} [put]
func (h *FeedHandler) UpdateFeed(c *gin.Context) {
	// 1. 解析路径参数
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		ErrorResponse(c, http.StatusBadRequest, "无效的ID")
		return
	}

	// 2. 解析请求体
	var req UpdateFeedRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		ErrorResponse(c, http.StatusBadRequest, "参数错误: "+err.Error())
		return
	}

	// 3. 调用 Service
	if err := h.feedService.UpdateFeed(id, req.Title, req.Category, req.Interval); err != nil {
		ErrorResponse(c, http.StatusInternalServerError, err.Error())
		return
	}

	// 4. 返回响应
	SuccessResponse(c, nil)
}

// DeleteFeed 删除订阅源
// @Summary 删除订阅源
// @Tags Feed
// @Produce json
// @Param id path int true "订阅源ID"
// @Success 200 {object} Response
// @Router /api/feeds/{id} [delete]
func (h *FeedHandler) DeleteFeed(c *gin.Context) {
	// 1. 解析路径参数
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		ErrorResponse(c, http.StatusBadRequest, "无效的ID")
		return
	}

	// 2. 调用 Service
	if err := h.feedService.DeleteFeed(id); err != nil {
		ErrorResponse(c, http.StatusInternalServerError, err.Error())
		return
	}

	// 3. 返回响应
	SuccessResponse(c, nil)
}

// ToggleFeedStatus 切换订阅源启用状态
// @Summary 切换订阅源启用状态
// @Tags Feed
// @Produce json
// @Param id path int true "订阅源ID"
// @Success 200 {object} Response
// @Router /api/feeds/{id}/toggle [post]
func (h *FeedHandler) ToggleFeedStatus(c *gin.Context) {
	// 1. 解析路径参数
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		ErrorResponse(c, http.StatusBadRequest, "无效的ID")
		return
	}

	// 2. 调用 Service
	if err := h.feedService.ToggleFeedStatus(id); err != nil {
		ErrorResponse(c, http.StatusInternalServerError, err.Error())
		return
	}

	// 3. 返回响应
	SuccessResponse(c, nil)
}

// RefreshFeed 手动刷新订阅源
// @Summary 手动刷新订阅源
// @Tags Feed
// @Produce json
// @Param id path int true "订阅源ID"
// @Success 200 {object} Response
// @Router /api/feeds/{id}/refresh [post]
func (h *FeedHandler) RefreshFeed(c *gin.Context) {
	// 1. 解析路径参数
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		ErrorResponse(c, http.StatusBadRequest, "无效的ID")
		return
	}

	// 2. 调用 Service
	newCount, err := h.feedService.RefreshFeed(id)
	if err != nil {
		ErrorResponse(c, http.StatusInternalServerError, err.Error())
		return
	}

	// 3. 返回响应
	SuccessResponse(c, gin.H{
		"message":      "刷新任务已提交",
		"new_articles": newCount,
	})
}

// RefreshAllFeeds 手动刷新所有订阅源
// @Summary 手动刷新所有订阅源
// @Tags Feed
// @Produce json
// @Success 200 {object} Response{data=service.RefreshAllResult}
// @Router /api/feeds/refresh-all [post]
func (h *FeedHandler) RefreshAllFeeds(c *gin.Context) {
	// 调用 Service（会并发抓取 + 自动重试）
	result, err := h.feedService.RefreshAllFeeds()
	if err != nil {
		ErrorResponse(c, http.StatusInternalServerError, err.Error())
		return
	}

	// 返回响应
	SuccessResponse(c, result)
}

// GetFeedStats 获取订阅源统计信息
// @Summary 获取订阅源统计信息
// @Tags Feed
// @Produce json
// @Success 200 {object} Response{data=service.FeedStats}
// @Router /api/feeds/stats [get]
func (h *FeedHandler) GetFeedStats(c *gin.Context) {
	// 调用 Service
	stats, err := h.feedService.GetFeedStats()
	if err != nil {
		ErrorResponse(c, http.StatusInternalServerError, err.Error())
		return
	}

	// 返回响应
	SuccessResponse(c, stats)
}
